home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / v7n12.arc / SCANTD.C < prev    next >
Text File  |  1988-06-21  |  6KB  |  169 lines

  1. /*              
  2.     SCANTD.C    Convert ASCII times and dates to binary
  3.  
  4.     by Ray Duncan, February 1988
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <dos.h>
  9.  
  10. union REGS regs;
  11.  
  12.                                     /* function prototypes */
  13. static void getctry(void);      
  14. int scantime(char *, int *, int *, int *);
  15. int scandate(char *, int *, int *, int *);
  16.  
  17.  
  18.                                     /* table of days of the month */
  19.  
  20. static int dom[] = {   31,          /* January   */
  21.                        28,          /* February  */
  22.                        31,          /* March     */
  23.                        30,          /* April     */
  24.                        31,          /* May       */
  25.                        30,          /* June      */
  26.                        31,          /* July      */
  27.                        31,          /* August    */
  28.                        30,          /* September */
  29.                        31,          /* October   */
  30.                        30,          /* November  */
  31.                        31 };        /* December  */
  32.  
  33. static char cbuff[34];              /* receives country info */
  34.  
  35. static int cflag = 0;               /* true if country info */
  36.                                     /* present in cbuff */
  37.  
  38.  
  39.  
  40. /*
  41.     Convert ASCII string into binary hour, minute, and second.
  42. */
  43.  
  44. int scantime(char *timestr, int *hour, int *min, int *sec)
  45. {   
  46.     *hour = *min = -1;              /* force hours and minutes 
  47.                                        to be entered */
  48.  
  49.     *sec = 0;                       /* allow seconds to default
  50.                                        to zero */
  51.  
  52.                                     /* validate time string */
  53.  
  54.     if( strspn(timestr,"0123456789:") != strlen(timestr) )
  55.  
  56.         return(0);                  /* exit if bad characters */
  57.  
  58.                                     /* convert fields of input 
  59.                                        using ':' as delimiter  */
  60.  
  61.     sscanf(timestr, "%d:%d:%d", hour, min, sec);
  62.  
  63.                                     /* check all results against
  64.                                        allowed values and return
  65.                                        flag for overall conversion */
  66.  
  67.     return( ( ( *hour>=0 ) && ( *hour<24  ) )  &&
  68.             ( ( *min>=0  ) && ( *min<60   ) )  &&
  69.             ( ( *sec>=0  ) && ( *sec<60   ) ) );
  70. }
  71.  
  72.   
  73. /*
  74.     Convert ASCII string into binary month, day, and year.
  75. */
  76.  
  77. int scandate(char *datestr, int *month, int *day, int *year)
  78. {
  79.     char sep1[2],sep2[2];           /* these little arrays receive
  80.                                        date separators from scanf */
  81.  
  82.     *month = *day = *year = -1;     /* user must enter all fields */
  83.  
  84.                                     /* now validate date string */
  85.  
  86.     if( strspn(datestr,"0123456789/-.") != strlen(datestr) )
  87.  
  88.         return(0);                  /* exit if bad characters */
  89.  
  90.     getctry();                      /* get country info */
  91.  
  92.  
  93.                                     /* convert fields of input 
  94.                                        according to current 
  95.                                        country, using '-', '/',
  96.                                        or '.' as delimiter  */
  97.  
  98.     switch(cbuff[0])                /* switch on date code */
  99.     {
  100.         case 0:                     /* USA: m d y */
  101.         sscanf(datestr, "%d%1s%d%1s%d", month, sep1, day, sep2, year);
  102.         break;
  103.  
  104.         case 1:                     /* Europe: d m y */
  105.         sscanf(datestr, "%d%1s%d%1s%d", day, sep1, month, sep2, year);
  106.         break;
  107.  
  108.         case 2:                     /* Japan: y m d */
  109.         sscanf(datestr, "%d%1s%d%1s%d", year, sep1, month, sep2, day);
  110.         break;
  111.     }
  112.  
  113.                                     /* allow entry of complete year
  114.                                        and correct it if necessary */
  115.  
  116.     if( (*year>=1980) && (*year<=1999) ) *year-=1900;
  117.  
  118.                                     /* set up days of month table */
  119.     if( (*year%4) == 0 )            /* if leap year ...           */
  120.          dom[1] = 29;               /* then February = 29 days    */
  121.     else dom[1] = 28;               /* else February = 28 days    */
  122.  
  123.                                     /* check all results against 
  124.                                        allowed values and return 
  125.                                        flag for overall conversion */
  126.  
  127.     return( ( ( *month>0  ) && ( *month<=12 ) )  &&
  128.             ( ( *day>0    ) && ( *day<=dom[*month-1] ) )  &&
  129.             ( ( *year>=80 ) && ( *year<=99  ) ) );
  130. }
  131.  
  132.  
  133. /*
  134.     Get MS-DOS internationalization information into
  135.     'cbuff', or provide default information.
  136. */
  137.  
  138. static void getctry(void)
  139. {   
  140.     int dosver;
  141.  
  142.     if(cflag) return;               /* exit if information 
  143.                                        already in buffer */
  144.  
  145.     memset(cbuff,0,34);             /* initialize buffer */
  146.  
  147.     regs.x.ax = 0x3000;             /* get MS-DOS version */
  148.     int86(0x21, ®s, ®s);
  149.     dosver = regs.h.al;
  150.  
  151.     if(dosver >= 2)                 /* if MS-DOS 2.x or 3.x */
  152.     {                               /* get country info */
  153.         (char *) regs.x.dx = cbuff;
  154.         regs.x.ax = 0x3800;
  155.         int86(0x21, ®s, ®s);
  156.     }
  157.  
  158.     if(dosver <= 2)                 /* if MS-DOS 1.x or 2.x */
  159.     {                               /* force delimiter info */
  160.         cbuff[9]  = '.';            /* decimal separator */
  161.         cbuff[11] = '/';            /* date separator */
  162.         cbuff[13] = ':';            /* time separator */
  163.     }
  164.  
  165.     cflag = -1;                     /* we've been here before */
  166. }
  167.  
  168.  
  169.